{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Anomaly Detection"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In this notebook we'll see how to apply deep neural networks to the problem of detecting anomalies.  Anomaly detection is a wide-ranging and often weakly defined class of problem where we try to identify anomalous data points or sequences in a dataset.  When dealing with time series specifically (such as a sensor or collection of sensors on a piece of equipment), defining something as anomalus needs to take into account temporal dependencies.  This is a challenge that deep learning models are fairly well suited to handle.  We'll start with a simple time series of sensor readings and see how to construct an autoencoder using LTSM's that predict future time steps in the series.  We'll then see how to use the distribution of the model errors to identify points in time that stand out as potentially being anomalus.\n",
    "\n",
    "The dataset used for this example can be found [here](https://raw.githubusercontent.com/numenta/NAB/master/data/realKnownCause/machine_temperature_system_failure.csv).  It's part of a collection of datasets that Numenta has hosted to showcase their own anomaly detection methods.\n",
    "\n",
    "Let's start by getting some imports out of the way and reading the data into a data frame."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import datetime\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "from jupyterthemes import jtplot\n",
    "jtplot.style()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(22695, 2)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('https://raw.githubusercontent.com/numenta/NAB/master/data/realKnownCause/machine_temperature_system_failure.csv')\n",
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>timestamp</th>\n",
       "      <th>value</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2013-12-02 21:15:00</td>\n",
       "      <td>73.967322</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2013-12-02 21:20:00</td>\n",
       "      <td>74.935882</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>2013-12-02 21:25:00</td>\n",
       "      <td>76.124162</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>2013-12-02 21:30:00</td>\n",
       "      <td>78.140707</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>2013-12-02 21:35:00</td>\n",
       "      <td>79.329836</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             timestamp      value\n",
       "0  2013-12-02 21:15:00  73.967322\n",
       "1  2013-12-02 21:20:00  74.935882\n",
       "2  2013-12-02 21:25:00  76.124162\n",
       "3  2013-12-02 21:30:00  78.140707\n",
       "4  2013-12-02 21:35:00  79.329836"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The data is very simple, just a series of timestamps and a value.  Many real-world problems will be much more complex than this (some industrial use cases might have hundreds or even thousands of variables) but the technique works the same no matter how many dimensions you're dealing with.  Since we only have one variable, let's plot it and see what it looks like."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f52126410f0>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1152x720 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "dark"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "data.set_index('timestamp').plot(figsize=(16, 10))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Visually there are a number of spots that look like they might be outliers, but it's hard to tell.  In any case, the eye test certainly doesn't scale or have any statistical robustness behind it, so we need a better approach.  Anomaly detection is not natively a supervised learning problem in most cases, and even if labels are available, there's often so few events that it's hard to build a model from them.  We can turn it into a supervised learning problem though by building an autoencoder that just predicts the next step in the time series.  Start by massaging the data into a format that we can use and creating the typical training and validation sets."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((20424, 1), (20424, 1), (2270, 1), (2270, 1))"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X = data['value'].values.reshape((len(data), 1))\n",
    "y = data['value'].values.reshape((len(data), 1))\n",
    "\n",
    "X = X[:-1, :]\n",
    "y = y[1:, :]\n",
    "\n",
    "X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.1, random_state=42)\n",
    "\n",
    "X_train.shape, y_train.shape, X_val.shape, y_val.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([74.935882]), array([74.935882]))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X[1, :], y[0, :]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "All we did is offset the X and y arrays by one (in the opposite direction) so each slice of y is the next value of the same slice of X.  We're not done though because we want the autoencoder to \"see\" more than one of the previous time steps so it can build a representation of the patterns in the data.  Start by setting up a few variable such as the number of time steps to model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "n_timesteps = 48\n",
    "n_samples = X_train.shape[0]\n",
    "n_features = X_train.shape[1]\n",
    "n_val_samples = X_val.shape[0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now we need to transform the input arrays so that each \"row\" contains an array of the previous values in the series, up to our number of time steps.  Keras expects the time slices as the 2nd dimension in the array so we'll take care of this now.  We also need to adjust the labels array to account for the fact that we're starting at a later time slice now."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((20377, 48, 1), (20377, 1), (2223, 48, 1), (2223, 1))"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train_list = [np.expand_dims(X_train[i-n_timesteps:i, :], axis=0) for i in range(n_timesteps, n_samples + 1)]\n",
    "X_train = np.concatenate(X_train_list, axis=0)\n",
    "y_train = y_train[n_timesteps-1:, :]\n",
    "\n",
    "X_val_list = [np.expand_dims(X_val[i-n_timesteps:i, :], axis=0) for i in range(n_timesteps, n_val_samples + 1)]\n",
    "X_val = np.concatenate(X_val_list, axis=0)\n",
    "y_val = y_val[n_timesteps-1:, :]\n",
    "\n",
    "X_train.shape, y_train.shape, X_val.shape, y_val.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now that we have the data ready to go, we can proceed with defining the autoencoder.  There is nothing particular in the architecture itself that makes a network an autoencoder, it's just a function of the task that we've set the network up to perform.  That said, they typically have an \"encoder-decoder\" pattern which we've implemented using LSTM layers below.  The output is just a linear activation on a dense layer with size equal to the number of features.  Either absolute error or squared error should work.  This is just something that has to be experimented with.\n",
    "\n",
    "I'll note that I spent zero time tuning this so don't get too absorbed in the details of this particular architecture.  It's going to vary a lot depending on the problem you're trying to solve."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
   ],
   "source": [
    "from keras import backend as K\n",
    "from keras.models import Model\n",
    "from keras.layers import Activation, BatchNormalization\n",
    "from keras.layers import Dropout, Dense, Input, LSTM\n",
    "from keras.optimizers import Adam\n",
    "\n",
    "def Autoencoder(n_timesteps, n_features):\n",
    "    i = Input(shape=(n_timesteps, n_features))\n",
    "    \n",
    "    x = LSTM(50, return_sequences=True)(i)\n",
    "    x = Dropout(0.4)(x)\n",
    "    \n",
    "    x = LSTM(50)(x)\n",
    "    x = Dropout(0.4)(x)\n",
    "\n",
    "    x = Dense(n_features, kernel_initializer='he_normal')(x)\n",
    "    x = Activation('linear')(x)\n",
    "\n",
    "    model = Model(inputs=i, outputs=x)\n",
    "    opt = Adam(lr=0.01)\n",
    "    model.compile(loss='mean_absolute_error', optimizer=opt)\n",
    "    \n",
    "    return model"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Always a good idea to look at the design and make sure it's doing what you expected."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 48, 1)             0         \n",
      "_________________________________________________________________\n",
      "lstm_1 (LSTM)                (None, 48, 50)            10400     \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 48, 50)            0         \n",
      "_________________________________________________________________\n",
      "lstm_2 (LSTM)                (None, 50)                20200     \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 50)                0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 1)                 51        \n",
      "_________________________________________________________________\n",
      "activation_1 (Activation)    (None, 1)                 0         \n",
      "=================================================================\n",
      "Total params: 30,651\n",
      "Trainable params: 30,651\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "model = Autoencoder(n_timesteps, n_features)\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Training is very straightforward.  The loss asymptotes on this dataset very quickly.  It's possible that 48 time steps isn't enough to really model patterns in the data, or maybe our architecture isn't sufficient, or maybe it's not even possible to do much better with just a single variable.  One of the challenges with anomaly detection is it's hard to even say what would constitute a \"good\" loss on this problem.  Remember our ultimate goal is not to predict the next time slice.  We're using this task as a way to model the data distribution which we'll use further downstream."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 20377 samples, validate on 2223 samples\n",
      "Epoch 1/10\n",
      "20377/20377 [==============================] - 10s 475us/step - loss: 43.0460 - val_loss: 12.0010\n",
      "Epoch 2/10\n",
      "20377/20377 [==============================] - 7s 336us/step - loss: 12.8038 - val_loss: 9.4660\n",
      "Epoch 3/10\n",
      "20377/20377 [==============================] - 7s 328us/step - loss: 12.7584 - val_loss: 9.5037\n",
      "Epoch 4/10\n",
      "20377/20377 [==============================] - 7s 342us/step - loss: 12.5310 - val_loss: 9.4008\n",
      "Epoch 5/10\n",
      "20377/20377 [==============================] - 7s 323us/step - loss: 12.5821 - val_loss: 9.4329\n",
      "Epoch 6/10\n",
      "20377/20377 [==============================] - 8s 369us/step - loss: 12.6675 - val_loss: 9.4203\n",
      "Epoch 7/10\n",
      "20377/20377 [==============================] - 7s 363us/step - loss: 12.5998 - val_loss: 9.4545\n",
      "Epoch 8/10\n",
      "20377/20377 [==============================] - 7s 331us/step - loss: 12.6180 - val_loss: 9.4370\n",
      "Epoch 9/10\n",
      "20377/20377 [==============================] - 7s 324us/step - loss: 12.6221 - val_loss: 9.4715\n",
      "Epoch 10/10\n",
      "20377/20377 [==============================] - 7s 321us/step - loss: 12.4302 - val_loss: 9.4015\n"
     ]
    }
   ],
   "source": [
    "model = Autoencoder(n_timesteps, n_features)\n",
    "history = model.fit(x=X_train, y=y_train, batch_size=128, epochs=10, verbose=1,\n",
    "                    callbacks=None, validation_data=(X_val, y_val), shuffle=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next we need to generate some predictions on the training data and calculate the error for each instance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20377, 1)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train_pred = model.predict(X_train)\n",
    "y_train_pred.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20377"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.metrics import mean_absolute_error\n",
    "errors = [mean_absolute_error(y_train[i, :], y_train_pred[i, :]) for i in range(y_train_pred.shape[0])]\n",
    "len(errors)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We now have a list of prediction errors from the model's training data.  The next step is to do something with these errors.  The general idea is that we can model the distribution of errors to capture the \"normal-ness\" of a given simple.  In other words, say we come up with a distribution where the mean is 10 and standard deviation is 5.  If we then had a new time slice that we run through the autoencoder and get an error of 11, we'd say that's probably not an anomaly because it's close to the mean.  However, if we get an error of 40 (i.e. the model is way off in it's prediction) then that's much more likely to be an anomaly.  One can imagine various different ways of employing this in a real-world system such as averaging recent errors over some period of time etc.\n",
    "\n",
    "First, let's see what happens when we do a kernel density estimation in seaborn.  This will give us a good idea of what the shape of the distribution should look like."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/john/anaconda/lib/python3.6/site-packages/scipy/stats/stats.py:1713: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.\n",
      "  return np.add.reduce(sorted[indexer] * weights, axis=axis) / sumval\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f5190726710>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "dark"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import seaborn as sb\n",
    "sb.kdeplot(errors, shade=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The errors don't quite appear to be normally distributed as there's a bit of a fat tail on the right side.  If this was a real project I might try to find something that fits better, but I think a gaussian is close enough for this example.  Let's load up scipy and fit the errors to a normal distribution."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(9.108284954559819, 10.442401924215941)"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from scipy.stats import norm\n",
    "params = norm.fit(errors)\n",
    "dist = norm(loc=params[0], scale=params[1])\n",
    "\n",
    "dist.mean(), dist.std()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We've got a mean of 9.25 and a standard deviation of 10.2.  That gives us a starting point to figure out which time slices are potential anomalies.  From here it's somewhat subjective.  We have to make a determination on how much of an outlier a point needs to be before we say it could be an anomaly.  Is it two standard deviations?  Three?  Making this call is probably going to be project-specifc.  We can make a generic function for \"scoring\" an error though regardless of where the cutoff is."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "def is_anomaly(error, mean, std, threshold):\n",
    "    delta = np.abs(error - mean)\n",
    "    multiple = delta / std\n",
    "    if multiple < threshold:\n",
    "        return 0\n",
    "    else:\n",
    "        return 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can now run new data through the autoencoder, score the resulting prediction to get an error, and determine if the new data represents a potential anomaly based on how far out in the distribution that error falls.  Let's see an example using the validation data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[1, 0, 0, 0, 0, 0, 0, 0, 1, 0]\n"
     ]
    }
   ],
   "source": [
    "y_val_pred = model.predict(X_val[:10, :, :])\n",
    "val_errors = [mean_absolute_error(y_val[i, :], y_val_pred[i, :]) for i in range(y_val_pred.shape[0])]\n",
    "result = [is_anomaly(x, dist.mean(), dist.std(), 2) for x in val_errors]\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We could also come up with a continuous scoring system using the cumulative density function."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "def anomaly_score(error, dist):\n",
    "    delta = np.abs(error - dist.mean())\n",
    "    return dist.cdf(dist.mean() + delta)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The higher the number, the more likely the sample is to be an anomaly."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[0.9972, 0.6592, 0.7765, 0.7504, 0.7755, 0.7101, 0.5185, 0.7756, 0.9958, 0.7567]\n"
     ]
    }
   ],
   "source": [
    "result = [np.round(anomaly_score(x, dist), 4) for x in val_errors]\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.8"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
